<?php
class User_Seance {
	private static $isLoginIn = null;
	private static $objUser = null;
	
	/**
	 * Метод проводит авторизацию пользователя
	 * @param User_User $objUser - объект пользователя
	 */
	public static function authorizationIn(User_User $objUser) {
		$hash = self::makeHash($objUser);
		setcookie('id', $objUser->id, time() + 9999999, '/');
		setcookie('hash', $hash, time() + 9999999, '/');
	}
	
	/**
	 * Метод осуществляет выход пользователя
	 */
	public static function authorizationOut() {
		// Чистим куки
		setcookie('id', '', time() - 3600);
		setcookie('hash', '', time() - 3600);
		// Удаляем объект пользователя - не обязательно, т.к. далее идёт редирект
		self::$isLoginIn = false;
		self::$objUser = null;
		// Обновляем страницу с который вышел пользователь
		//User_Seance::moveTo($_SERVER['HTTP_REFERER']);
		User_Seance::moveTo(W_ABSPATH);
		exit();
	}
	
	/**
	 * Метод получает id текущего пользователя
	 */
	public static function getId() {
		if(self::isLogged()) return self::$objUser->id;
		else return null;
	}
	
	/**
	 * Функция делает проверку, залогинен ли пользователь
	 */
	public static function isLogged() {
		if(self::$isLoginIn === null) {
			self::$isLoginIn = false;
			$objUser = new User_User();
			if(empty(self::$objUser)) self::$objUser = $objUser; 
			if (!isset($_COOKIE['id']) || !isset($_COOKIE['hash'])) return false;
			$hash = $_COOKIE['hash'];
			$id = Service_Escape::absolutelyEscapeString($_COOKIE['id']);
			$objUser = new User_User($id);
			
			if ($objUser->id && $hash == self::makeHash($objUser)) {
				self::$isLoginIn = true;
				self::$objUser = $objUser;
			}
		}
		return self::$isLoginIn;
	}
	
	/**
	 * Метод возращает объект текущего польтзователя
	 * @return User_User - объект пользователя
	 */
	public static function getUser() {
		if(!self::$objUser) self::isLogged();	// Если в переменной нет пользователя, запускаем isLogged, который прорит залогиненность пользователя и при успехе загрузит его объект
		return self::$objUser;
	}
	
	public static function makeHash($objUser) {
		if($objUser->getField('vk_id') && $objUser->getField('e_mail') == null) { // Пользователь зашедший через vk и не имеющий аккаунта на сайте
			$hash = md5($objUser->id . $objUser->getField('vk_id') . 'outsider');
		}
		else {
			$hash = md5($objUser->id . $objUser->getField('e_mail') . 'outsider');
		}
		return $hash;
	}
	
	/**
	 * Метод переправляет пользователя на другую страницу.
	 *
	 * @param string $location
	 */
	public static function moveTo($location) {
		header('HTTP/1.1 301 Moved Permanently');
		header('Location: ' . $location);
		exit();
	}
	
	/**
	 * Метод переправляет пользователя на другую страницу.
	 *
	 * @param string $location
	 */
	public static function moveToWithMessage($location, $text, $isError = 0) {
		$_SESSION['message'] = array(
			'text' => $text,
			'is_error' => $isError
		);
		header('HTTP/1.1 301 Moved Permanently');
		header('Location: ' . $location);
		exit();
	}
	
	/**
	 * Метод проверяет является ли текущий пользователь админом
	 */
	public static function isAdmin() {
		if(!self::isLogged()) return false;
		else return self::$objUser->getField('is_admin');
	}
	
	public static function visit() {
		$objUser = self::getUser();
		if($objUser->id) $objUser->updateFields(array('last_visit' => gmdate("Y-m-d H:i:s", time())));
	}
	
	/**
	 * Обновляет данные в объекте пользователя сеанса
	 * 
	 * @param array $arrFields - массив данных для обновления
	 */
	public static function UpdateUserFields(array $arrFields) {
		if(!self::$objUser) return false;
		foreach($arrFields as $arrField) {
			self::$objUser->setFields($arrFields);
		}
	}
}